Technical Q&A

Java 09 - Javaでパブリックメソッドを AppleScript から隠す(1999 年 5 月 17 日)


Q: クラス内に、AppleScript に公開したくないパブリックメソッドがいくつかあります。Java コード内でメソッドを公開しないように指定することはできますか。あるいは、そのように指定するには 'aete' を編集しなければならないでしょうか。

A: コード内で簡単に指定できます。クラス情報を持つ BeanInfo を作成すれば、自動的に生成される 'aete' リソースからプロパティとメソッドの両方を除外することが可能です。

たとえば、次のような Salad.java クラスがあるとします。


public class Salad
{
   public int  msgAmount; 
// これが、構成要素のリストに含めたくないメソッド

public void setMsgAmount( int amount ) { msgAmount = amount; } public int getMsgAmount( ) { return msgAmount; } public void addMSG( int amount ){ ... } // hide this too ... };

この場合は、次のようにして SaladBeanInfo.java を作成できます。


import
                  java.beans.*;
                  import java.lang.reflect.*;
                  public class
                  SaladBeanInfo extends SimpleBeanInfo
{
    public MethodDescriptor[ ] getMethodDescriptors()
    {
        MethodDescriptor md[ ] = new MethodDescriptor[1];
        try
                          {
           md[0] = new MethodDescriptor( getMethod( Salad.class, "addMSG" ), pd );
           md[0].setHidden( true );
           return md;
        }
        catch ( IntrospectionException e )
        {
             e.printStackTrace();
        }
        return null;
    }
    public PropertyDescriptor[ ] getPropertyDescriptors()
    {
        PropertyDescriptor pd[ ] = new PropertyDescriptor[1];
                  
        try
                          {
             pd[0] = new PropertyDescriptor( "msgAmount", Salad.class );
             pd[0].setHidden( true );
             return pd;
        }
        catch ( Exception e )
        {
             e.printStackTrace();
        }
        return null;
     }
                  
     Method getMethod( Class c, String methodName ) throws
                  IntrospectionException
	{
		Method methods[ ] = c.getMethods();
                  
		for ( int i = 0; i < methods.length; i++ )
		{
			if ( methods[i].getName().equals( methodName ))
			{
				return methods[i];
			}
		}
		throw new IntrospectionException( "No such method ¥"" + methodName + "¥"" );
	}
}


ここでは、最初にメソッドの記述子を作成し、setHidden( true )を呼び出して isHidden プロパティを「true」に設定しています。これによってイントロスペクタ (introspector) に対し、このメソッドの情報を 'aete' ジェネレータに返さないということが伝えられます。そのため、このメソッドはアプリケーションに対する AppleScript の辞書に表示されません。

プロパティを隠す手順は多少異なりますが、きわめて簡単です。上記のコードでは PropertyDescriptor を作成して、java.beans.FeatureDescriptor から継承した setHidden() メソッドを呼び出しています。こうすると、スクリプトの記述者 (および好奇心の強いユーザ) は、この隠れたプロパティについて知ることができなくなります。


-- Michael Hopkins
Worldwide Developer Technical Support


Technical Q&As | Contents
Previous Question | Next Question

To contact us, please use the Contact Us page.